!% -XSDE2 !=== Constant Story "Colophon"; Constant Headline "^where stories end, where flowers bloom. ^by Akiva Leffert.^"; Include "Parser"; Include "VerbLib"; !=== ! Classes Class Room has light; Class Prop with before [; Examine: return false; default: print_ret "You don't need to worry about ", (the) self, "."; ], has scenery; Class NPC with times_spoken 0, life [; Answer,Ask,Order,Tell: print_ret "Try talking to ", (the) self, "."; ], has animate; Class Tavern with class Room, has enterable; ! Rooms Room lying_field "" with initial [; style bold; print "^*** You have died. *** ^"; style roman; print_ret "You awake lying in a grassy field of daffodils and tall sunflowers. You feel lightheaded and sore limbed. The sun caresses your face. You feel like you could just lie in the field forever. Maybe you can. And yet, somehow eternity seems to call you to stand and seize the day. After all, you have work to do."; ], description "You lie in a grassy field of daffodils and light sunflowers.", before [; Exit: print "You stand, shaking a deep weariness from your limbs as you rise.^"; PlayerTo(standing_field); return true; ], cant_go "You do not feel like crawling or rolling anywhere. You should probably stand up."; Prop with name 'day', before [; Take: print_ret "You try to seize the day but find it difficult to get a hand on it."; ], found_in lying_field; Prop with name 'flower' 'flowers' 'daffodil' 'daffodils' 'sunflower' 'sunflowers' 'tall', before [; Take: print_ret "You lack the leverage to pluck a flower. Maybe if you were standing..."; Examine: print_ret "The flowers are pretty in the morning light, though from your vantage point you mainly see stems."; Talk: print_ret "The flowers whisper back to you in the breeze."; ], found_in lying_field has animate; Room standing_field "Field" with description "You are in a grassy field of daffodils and tall sunflowers. You feel lightheaded and sore limbed. The sun caresses your face. You see a path nearby, that appears to lead north to the city.", before [; Take: if(noun == daffodil) { if(IndirectlyContains(player, daffodil)) { print_ret "You feel like you've taken the life of enough daffodils."; } else { move daffodil to player; print_ret "You reach down and take a flower. It makes a satisfying pluck noise."; } } ], n_to road_side, cant_go "The field sure is pretty, but you don't feel like idly frolicking."; Object daffodil "daffodil" standing_field with description [; if(IndirectlyContains(player, self)) { if(self has worn) { "The daffodil looks snazzy in your button hole."; } else { "The daffodil is a vivid yellow. You can't help but think it would make an excellent boutonniere."; } } else { "The daffodils are a vivid yellow. You can't help but think one would make an excellent boutonniere."; } ], before [; Wear: give self worn; print_ret "The daffodil looks quite fashionable attached to the buttonhole of your left breast pocket."; Drop: print_ret "You think to give it one last look then decide it is too pretty to part with."; ], name 'daffodil' 'daffodils' has clothing concealed; Prop sunflower "sunflowers" standing_field with description "The sunflowers stretch on as far as you can see.", name 'sunflower' 'sunflowers' 'flowers' 'flower', has pluralname; Prop path "path" standing_field with description "The dusty path leads north to the city.", name 'path' 'road'; Room road_side "On the Road" with description "You stand on a wide dusty path leading north to the nearby city. A man sits on a rock by the side of the road, his head in his hands. The air smells faintly of ozone.", s_to standing_field, n_to outer_gates; Prop rock "rock" road_side with name "rock", description "The rock rocks."; NPC sad_man "man" road_side with description "The man sits on a rock by the side of the road. His head rests in his hands and you see his thick black hair shake in time with faint sobs. On his arm, is a piece of cloth cut in a faded yellow sunburst.", name 'man', life [; Talk: print_ret "He looks up briefly. You can see the red in his eyes and the tears sliding down his cheeks. When he sees you, a wave of disappointment crosses his face and he puts his head back in his hands"; Give: if(noun == daffodil && IndirectlyContains(player, daffodil)) { if(daffodil has worn) { print_ret "Inspired by a noble idea, you try to offer the man the daffodil, but it is stuck in your buttonhole. You suspect he doesn't really want it."; } else { print_ret "You remove the daffodil from your pocket, look at it, and put it back in your pocket. You feel that it would be somehow inappropriate to give to the crying man."; } } ] has proper concealed; Object meeting_note "note" with name 'note', description "A scrap of paper with ~Meet at the Sign of the Dactyl~ scrawled upon it in a messy hand."; Room outer_gates "Outer Gates" with description "You stand at the gates to a large walled city. A slow stream of people pour in and out, mostly out. An ad-hoc marketplace of shacks and stalls hugs the walls to the east and west. The city itself lies to the north. There is a large wrought iron sign above the open gates. It reads: 'Momento Mori.'", s_to road_side, e_to market_east, w_to market_west, n_to [; if(daffodil has worn && guard.seen_flower == 0) { print "As you walk to the gate, the guard eyes the flower on your chest. He walks up to you and shakes your hand. You feel him slide a piece of paper on your palm. ~Welcome to Colophon, where stories end, where flowers bloom, brightest of the cities beyond the sunset. May Lady Fortune walk beside you.~ You smile and thank him for his kind words. You are glad to have made contact so easily."; guard.seen_flower = true; move meeting_note to player; } else { print "The guard nods to you as you pass"; } PlayerTo(inner_gates); return true; ]; Room market_east "Outer Market East" with initial [; if(self hasnt visited) { print "Wandering through the marketplace, you come to stand in a small clearing. On one side stands a buxom woman in bright skirts outside a starry blue tent. She is clearly no longer young, but you are unable to determine her age. She glances at you briefly, as if trying to look without being noticed. You pretend not to notice. ^ On the other side, you find the smoke and smell of a hot food stand. Through the smoke you see a burly man in a thin greasy shirt. The mammoth walls of the city tower over you to the north. The entrance to the city stands to the west."; if(~food_vendor.eaten_meat) { print " You realize that you're quite hungry."; } } return true; ], description "You stand in a small clearing between a starry blue tent and a food stall.", w_to outer_gates, n_to "You look at the crumbling walls of the city and decide not to scale them."; Prop astrologer_tent "tent" market_east with description "A blue tent covered with silvery star shaped patches in the shape.", name 'tent' 'blue' 'starry', before [; Enter: <>; ] has scenery; NPC astrologer "astrologer" market_east with description "A buxom woman in bright skirts.", name 'buxom' 'woman' 'astrologer', before [; Talk: if(self.times_spoken > 0) { print_ret "~Remember,~ she whispers."; } else { self.times_spoken = 1; print_ret "You walk up to the woman and her tent. You hear a harp play softly in the distance. ^ ~You noble sir, with the bright face and haunting eyes,~ she says to you in her silky smooth voice. ~Do you know your future? Do you know your dreams? Do you know your life? I will tell you all... for a price.~ ^ You tell her you have no money. ^ She laughs. ~I have no need for such illusions. All I ask is that you leave me a place in your memory. Just a little corner. Do you have memories of crowds - sporting contests, political speeches? I will be a face on a busy street. Just a little fragment of rememberance. Is this agreeable to you? Good. Step this way.~ ^ She leads you into her dimly lit tent as you wonder about the bargain you have just made. The only light inside is a braided candle of white and crimson standing in a gilt candelabra on the edge of a small round table in the center of the room. She motions for you to sit on one side of the table and, carefully arranging her skirts, sits down on the other. In the shadows she suddenly seems quite beautiful. Snakes of misty incense swirl between you. She asks for your palm and you hold out your hand across the table. You feel the heat of the candle just to the side of your wrist. She takes your hand in hers and slowly, firmly, provocatively traces her finger across the lines of your palm. ^ ~I see many children,~ she says softly. ~I see love and hate, strife between gods.~ You are lost in her eyes. ~I see sun and moon, and far cold earth. I see life in your future. Oh!~ she pauses, an excitement on her face that quickly levels into a soft grin. ~Welcome to Colophon, where stories end, where flowers bloom.~ She leans over slowly and kisses your palm. The candlelight flashes bright, temporarily blinding you. In that blind moment she leads you up from your seat and out of the tent."; } ] has concealed; Prop food_stall "food stall" market_east with description "A smokey food stand. It smells delicious.", name 'stall' 'food', before [; Enter: <>; ] has scenery; NPC food_vendor "food vendor" market_east with eaten_meat false, description "Through the smoke you see a burly man attending to a large flame.", name 'food' 'vendor' 'burly' 'man', before [; Talk: if(self.eaten_meat) { print_ret "~Still hungry?~ He frowns at you. ~Still broke?~ You nod. He goes back to tending his fire."; } else { if(self.times_spoken == 0) { print "~Ahhh, smells good, yes?~ His accent is strong, but unplaceable. ~You want, meat? Is good meat! Freshest meat! No money, you say? Bah! I will take future."; } if(astrologer.times_spoken == 0 && self.times_spoken == 0){ print " ~Talk to her.~ He gestures toward the woman at the tent. She give you future. You give me future.~"; } else if(astrologer.times_spoken > 0) { print " ~She told you, yes? Now you tell me.~ You consider whether it is okay to tell what you were told. You decide that you are quite hungry and tell him what she said. As you begin speaking, he picks up a jagged knife to slice some pieces of miscellaneous meat from his slowly spinning spit. You decide it wise not to consider its provenance. ^ ~Ohhh,~ he begins, after you finish recounting your experience.. ~Stories end, flowers bloom.~ He hands you your reward: thin juicy meat slices wrapped in a piece of warm flatbread and slathered with a mysterious white sauce. You eat it. It is delicious."; self.eaten_meat = true; } else { print "~Still no money? Still no future? Still no meat! Talk to lady!~"; } self.times_spoken = 1; return true; } ], has concealed; Room market_west "Outer Market West" with description "You stand in the midst of a bustling mass of shops and stalls, but none particularly interest you. The entrance gates of the city stand to your east. Looming over you to the north stands the thick stonework of the city walls.", e_to outer_gates, n_to "You look at the crumbling walls of the city and decide not to scale them."; NPC guard "guard" outer_gates with description "The gatekeeper of the city. His imposing appearance is offset by the daffodil stuck through his vest.", name 'guard' 'gatekeeper', before [; Talk, Answer,Ask,Order,Tell: "He seems too distracted by watching those entering and leaving the city to speak to you."; ], seen_flower false; Room inner_gates "Inner Gates" with initial [; if(self hasnt visited) { print_ret "^^You walk through the great gates and into the city, coming to stand on a wide road that rapidly narrows and splays off in all directions. The passersby all seem curiously focused and intent on going by as quickly as possible. You feel it is not so much that they are in a hurry, as that if they went more slowly it would give them too much time to think and look at their surroundings. ^ The roads and sidewalks are impeccably neat and orderly. There are no stray cracks and the bricks are perfectly aligned. The storefornts are freshly painted in a uniformly bland sans serif. The importance of your mission crystallizes in your head. This is a city that needs to create love, not destroy it. You think back to the man you saw beside the road and a quiet anger wells up in you. ^ Naturally, the signage is also impeccable. The northeast path is labeled Alabastor, due north is Galleons, and west is the Poet's Quarter."; } ], description "You stand on a road just inside the main entrance to the city. The road branches off to the different sections of the city as indicated by the sign. ", s_to outer_gates, n_to galleons, ne_to alabaster, w_to poets_quarter; Prop sign "sign" inner_gates with description "The sign is neatly painted and directs you in three directions: Northeast to Alabaster, north to the Galleons, and west to the Poet's Quarter", name 'sign'; Room galleons "Galleons" with description "Galleons is what a sounds like, a long row of docked ships. The ships, gutted, without sails, and lashed together, are no longer sea worthy and might as well be part of the land for all the distance they go. A road leads south back to the inner gates. A southwest road leads off to the Poet's Quarter. A narrow stretch of land leads north beyond a mass of barbed wire fence and a matching set of factory issue armed guards.", n_to "As much as you would like to work out some aggression on those soldiers, you know that would not be a plan for success.", s_to inner_gates, sw_to poets_quarter; NPC guards "guards" with name 'guard' 'guards', description "They look so young.", before [; Talk: "You aren't here to chat with the likes of these."; Attack: "As young as they look, they are heavily armed. You have a policy about going to gun fights empty handed and you are not about to violate it."; ] has scenery pluralname; Room alabaster "Alabaster" with description "Alabaster is the head of the city, where the wheels of government turn. Before you is a grassy plaza ringed with large government buildings. An aging copper statue, losing a war with patina stands on a stone pedestal in the center of the plaza. ^ To the sides, two buildings in particular stick out, the first, to the east, a great edifice of marble columns and tall windows, with heavy steps up to a heavily guarded entrance. To the west is its negative twin. The ground lowers around it, placing it in a small valley with steps leading down, and long ridged gutters carved into the front countering the columns. ^ The financial district lies to the north. Southwest leads back to the inner gates of the city.", e_to "As much as you would like to have words (and actions) with the rulers of this place, you have important things to do.", w_to "As much as you would like to have words (and actions) with the rulers of this place, you have important things to do.", n_to financial_district, sw_to inner_gates; Prop alabaster_statue "statue" alabaster with description "A tall copper statue, turning to a stately green. It shows a man, prideful and haughty, his throat slit with frozen bronze rivulets snaking down. Beneath it there is a wordy plaque.", name 'statue' 'copper'; Prop alabaster_plaque "plaque" alabaster with description "The plaque reads:^Jericho Marsh, Fourth and last Lord Alabaster. Saved the city from barbarian invaders. Could not save the city from himself. Executed in 1644.", name 'wordy' 'plaque'; Room financial_district "Financial District" with in_scope alley financial_buildings, description [; print "Unlike government, the wheels of finance never stop turning and this area is a flurry of activity. Frantic men immaculately dressed run between the buildings that line the street carrying thick stacks of paper."; if(self hasnt visited) { print " You think of tripping one and ruining his suit, but you manage to stifle the urge just as a particularly intent looking gentleman passes you by. It is rough going though."; } print_ret " Each building has its own sigil above its door. Signs of Mercury and Pluto, of feathers and dice, of coins and songs. Off to the side there is a dark alley between the finance buildings."; ], in_to alley; Room alley "Alley" with description [; print "A dark dead end alley between the sign of the horseshoe and the sign of the golden apple."; if(location == self) { print " You see a half open door leading beneath one of the buildings."; } return true; ], name 'dead' 'end' 'dark' 'alley'; Room financial_buildings "Financial Buildings" with description "The home of a financial house.", before [; Enter: print_ret "As interested as you are in the mechanisms of high finance you decide not to bother the proprietors at this point in time."; ]; Room poets_quarter "Poet's Quarter" with in_scope iamb_tavern spondee_tavern, description "The poet's quarter is a corridor of taverns and soapboxes, populated by strange grizzled men. The place is dead silent. A square-jawed man with just a hint of melancholy in his eyes patrols the streets, giving those who dare to whisper a death stare, which instantly silences them. On one side of the road there is a tavern whose sign is a short line and a long line painted in red, the tavern across from it has two longer lines painted in green on its sign. ^ The quarter continues to the west. East leads back to the city gates.", before [; Enter: if(noun == iamb_tavern) { PlayerTo(iamb_tavern); return true; } else if(noun == spondee_tavern) { PlayerTo(spondee_tavern); return true; } ], e_to inner_gates, w_to poets_quarter_mid; NPC square_jawed_man "square jawed man" poets_quarter with description "You avoid looking too directly at him so as not to draw attention to yourself, but you see a rough looking man with a stern face.", name 'man' 'square-jawed' 'square' 'jaw', before [; Attack, Talk: print_ret "This seems contrary to your goal of maintaining a low profile."; ] has scenery; Room poets_quarter_mid "Center of Poet's Quarter" with in_scope dactyl_tavern amphibrach_tavern, description "You stand on the main drag in the middle of the poet's quarter. It extends east and west. On one side of the road there is a tavern whose sign is painted red with a long line between two short lines, the tavern across from it has a longer line followed by two short lines painted in green on its sign.", before [; Enter: if(noun == dactyl_tavern) { PlayerTo(dactyl_tavern); return true; } else if(noun == amphibrach_tavern) { PlayerTo(amphibrach_tavern); return true; } ], e_to poets_quarter; Tavern amphibrach_tavern "Amphibrach Tavern" with out_to poets_quarter_mid, description [; DescribeTavern(self, "Ah, the last time we saw you, you looked so much older."); return true; ], name 'red' 'tavern' 'with' 'sign' 'amphibrach'; NPC contact "Contact"; Tavern dactyl_tavern "Dactyl Tavern" with out_to poets_quarter_mid, description [; DescribeTavern(self, "This is the forest primeval. The murmuring pines and the hemlocks."); if(daffodil has worn && contact.times_spoken == 0) { print "^^A man rises from his table and comes up to you. He has a small sharp nose and a look of fierce intelligence interrupted by tired eyes. ^ ~Cousin!~ He says, tapping the daffodil on your chest before giving you a hug. ~Sit! You want a drink. No it's not a question. You want to keep a clear head? Foolishness. Foolishness.~ He walks the two of you over to the bartender. ~One more for me and one for my cousin here.~ Money and drinks exchange hands and he walks you over to his small table in a loud area of the room not too far from the raving poet. ^ ~How are you? Did you have a good trip? How is your mother?~ ^ ~I'm well. Mother,~ you emphasize the word, ~sends her regards. It is hard to hear you over the noise..~ ^ ~Exactly.~ You both lean in closely across the small round table. The man's next words follow in a strong whisper. ^ ~I hear you're the best.~ ^ ~I am,~ you respond with smooth confidence. He smiles. ^ ~It's good that you're here, before the whole city dies of sorrow.~ ^ ~This will kill it anyway.~ ^ ~Yes, but it will die a good death.~ ^ ~Let's get down to business.~ ^ ~There is a small peninsula beyond the Galleons where they hold them before they split them. After that, one side is taken east and the other west in crowded ships, but where they go is a tightly held secret. We are going to lead a riot.~ You perk up at this, you like riots. ^ ~I like riots.~ ^ ~This is going to be a special riot and we need you to make it special. Tomorrow morning two hours past dawn, there will be a fire. Simulatenously, a brawl will break out around 'bastor, two political gangs are going to put on a show. Let it never be said that they are parasites on the community. And you will have been in the detention area all night, spreading messages, opening gates, and organizing a prisoner revolt.~ ^ From there he explains the details of the plan. You commit it to memory, for later"; style bold; print " recall."; style roman; print " He gets up and leaves. ~Good luck cousin.~"; contact.times_spoken++; return true; } return true; ], dusk_message 0, before [; Exit: if(contact.times_spoken > 0 && self.dusk_message == 0) { self.dusk_message = 1; print "As you step out of the tavern, you notice that dusk is nearing and the dim lighting is the same inside and out.^"; } ], name 'green' 'tavern' 'with' 'sign' 'dactyl'; Tavern iamb_tavern "Iamb Tavern" with out_to poets_quarter, description [; DescribeTavern(self, "This is the forest primeval. The murmuring pines and the hemlocks."); return true; ], name 'red' 'with' 'sign' 'tavern' 'iamb'; NPC bartender "bartender" with description "A bartender", name 'bartender', found_in [; return location ofclass Tavern; ], before [; Talk: switch(self.times_spoken) { 0: print "You start to order a drink and stop when you realize you don't have any money. ^ ~New in town?~ the bartender asks as you fumble sadly through your pockets. You try to think of something innocuous to say. Innocuous doesn't come easy to you. You think back to times over the years where your failure to be innocuous got you in trouble. You decide to change the subject. ^ ~Why is that guy reciting gobbledegook?~ ^ ~It's poetry.~ He shrugs. ^ ~Doesn't sound like any poetry I've heard.~ ^ ~He's a poet. He's reciting.~ He pauses, giving a wry smile time to cross his lips. ~Poets recite poetry.~ ^ ~You seem skeptical.~ ^ ~I never insult customers. You on the other hand...~ ^ ~Touche.~ ^ ~Know what? Welcome to town. We don't get too many new people coming in these days. Have a drink on the house. It'd be nice for someone to think well of us for once.~ He fills you a frosty amber glass and as you sip it, the words of the poet in the corner seem to start making sense. They still don't mean anything, but you can fill them reaching into your head, reconfiguring feelings like untying a knot. ^ You try to hate the calm, the weakness of it, the detached apathy, but your mind is beyond your control. You drift. And then he stops. Sense returns to the world. ^ ~That was a hell of a drink,~ you tell the bartender. He smiles."; 1: print "~Still broke? Well, you're not getting another drink out of me. I may be a fool, but I'm not an idiot. Well, except for a pretty face, but that's no worry with you.~"; 2: print "~You seem to spend a lot of time in taverns. Maybe you should talk to someone.~"; default: print "He ignores you and looks sick of talking to you."; } self.times_spoken = self.times_spoken + 1; return true; ] has concealed; Tavern spondee_tavern "Spondee Tavern" with out_to poets_quarter, description [; DescribeTavern(self, "White founts falling in the courts of the sun."); return true; ], name 'green' 'with' 'sign' 'tavern' 'spondee'; !=== ! Entry point routines [ Initialise; location = lying_field; lookmode = 2; ]; !OOP is bad mmkay. [ InScope i; if(real_location provides in_scope) { if(metaclass(real_location.in_scope) == Routine) { real_location.in_scope(); } else if(metaclass(real_location.in_scope) == Object) { for(i = 0: i < real_location.#in_scope / 2: i++) { PlaceInScope(real_location.&in_scope-->i); } } } return false; ]; [ DescribeTavern tavern quote; if(location == tavern) { print "You stand in a dark, bustling tavern. A sign over the bar says: ~"; quote.print(); print "~ The bartender is a gruff looking man, with three day stubble and a battered brown leather coat. In the corner stands a man reciting verse from a piece of crumpled paper. His words seem to be nonsense and the patrons of the tavern, absorbed in business of their own ignore him."; } else { print "A dingy house of booze and verse."; } ]; [ RecallPlanSub; if(contact.times_spoken == 0) { print_ret "Now isn't the time for reminiscence. It is time for action!"; } else { print_ret "You go over the plan in your head: ^ 1. Find tunnel to compound somewhere in the financial district. ^ 2. Navigate tunnels into detention camp. ^ 3. Avoiding guards, unlock all three prisoner areas. ^ 4. Rouse and inspire prisoners. ^ 5. Save the day."; } ]; [ ActionSub; if(location == lying_field) { print_ret "Standing up sounds like a good action for starters."; } else { print_ret "That's what you're here for isn't it?"; } ]; Include "Grammar"; !=== Verbs [ TalkSub; if (noun == player) print_ret "Nothing you hear surprises you."; if (RunLife(noun,##Talk) ~= false) return; print_ret "At the moment, you can't think of anything to say."; ]; Verb 'talk' 't//' 'converse' 'chat' 'gossip' * 'to'/'with' creature -> Talk * creature -> Talk; Verb 'seize' = 'take'; Verb 'recall' 'remember' * 'plan' -> RecallPlan * -> RecallPlan; Verb 'action' * -> Action;